package com.sxj.shop.service.impl;

import com.sxj.shop.dao.UserDao;
import com.sxj.shop.entity.User;
import com.sxj.shop.exception.*;
import com.sxj.shop.factory.ObjectFactory;
import com.sxj.shop.service.UserService;
import com.sxj.shop.util.MD5Util;
import com.sxj.shop.util.ParameterUtil;

/**
 * @author 石小俊
 * @date 2023年12月2023/12/5日 18:28
 * 核心业务逻辑,实现具体的业务
 */
public class UserServiceImpl implements UserService {

    private UserDao userDao = (UserDao) ObjectFactory.getObject("userDao");

    @Override
    public void register(String username, String password, String phone, String address) throws RequestParameterErrorException, UserExistException {
        // System.out.println("************正在执行核心业务逻辑************");
        // 注册时所有信息不能为空
        if (ParameterUtil.isNull(username) || ParameterUtil.isNull(password) || ParameterUtil.isNull(phone) || ParameterUtil.isNull(address)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 判断当前用户名是否已经被注册
        // 根据用户名去数据库中查询数据
        User selectUser = userDao.selectByUsername(username);
        // 如果查询到数据了,说明该用户名已经被注册了,不允许再次注册,抛出异常
        if (selectUser != null) {
            throw new UserExistException("此用户名太受欢迎,请更换一个");
        }
        // 如果没有抛出异常,说明数据库中尚未注册过该用户名
        // 因此,可以使用当前信息进行注册
        // 对于密码,一般不允许直接明文注册,而是需要对密码进行加密后注册
        User user = new User(username, MD5Util.md5(password), phone, address);
        // 调用持久层方法执行添加操作
        userDao.insertUser(user);
    }

    @Override
    public User login(String username, String password) throws RequestParameterErrorException, UserNotExistException {
        if (ParameterUtil.isNull(username) || ParameterUtil.isNull(password)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        User user = userDao.selectByUsernameAndPassword(username, MD5Util.md5(password));
        if (user == null) {
            throw new UserNotExistException("用户名或密码错误");
        }
        return user;
    }

    @Override
    public void modifyPassword(User user, String oldPassword, String newPassword, String newPassword2) throws UserNotLoginException, PasswordErrorException {
        if (user == null) {
            throw new UserNotLoginException("用户未登录,请先登录!");
        }
        if (!MD5Util.md5(oldPassword).equals(user.getPassword())) {
            throw new PasswordErrorException("原密码不正确,请重新输入!");
        }
        if (!newPassword.equals(newPassword2)) {
            throw new PasswordErrorException("两次输入的密码不一致,请重新输入!");
        }
        userDao.updatePasswordById(user.getId(), MD5Util.md5(newPassword));
    }
}
